package com.huangyi.adminservice.user.controller;


import com.huangyi.adminservice.user.domain.dto.PasswordLoginDTO;
import com.huangyi.adminservice.user.domain.dto.SysUserDTO;
import com.huangyi.adminservice.user.domain.dto.SysUserListReqDTO;
import com.huangyi.adminservice.user.domain.vo.SysUserLoginVO;
import com.huangyi.adminservice.user.domain.vo.SysUserVo;
import com.huangyi.adminservice.user.service.ISysUserService;
import com.huangyi.commondomain.domain.R;
import com.huangyi.commondomain.domain.vo.TokenVO;
import com.huangyi.commonsecurity.dto.TokenDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * B端用户服务控制器类
 */
@RestController
@RequestMapping("/sys_user")
public class SysUserController {

    @Autowired
    private ISysUserService sysUserService;

    /**
     * B端用户登录
     *
     * @param passwordLoginDTO B端用户登录DTO
     * @return token信息
     */
    @PostMapping("/login/password")
    public R<TokenVO> login(@Validated @RequestBody PasswordLoginDTO passwordLoginDTO) {
        TokenDTO tokenDTO = sysUserService.login(passwordLoginDTO);
        return R.ok(tokenDTO.convertToVo());
    }

    /**
     * 新增或编辑用户
     * @param sysUserDTO B端用户信息
     * @return  用户ID
     */
    @PostMapping("/add_edit")
    public R<Long> addOrEditUser(@RequestBody SysUserDTO sysUserDTO) {
        return R.ok(sysUserService.addOrEdit(sysUserDTO));
    }

    /**
     * 查询B端用户
     * @param sysUserListReqDTO 用户查询DTO
     * @return B用户列表
     */
    @PostMapping("/list")
    public R<List<SysUserVo>> getUserList(@RequestBody SysUserListReqDTO sysUserListReqDTO) {
        // 将 DTO 列表转换为 VO（视图对象）列表，并包装在统一响应 R 中返回
        List<SysUserDTO> sysUserDTOS = sysUserService.getUserList(sysUserListReqDTO);
        return R.ok(sysUserDTOS.stream()      // 将 DTO 列表转换为 Stream
                .map(SysUserDTO::convertToVO) // 对每个 DTO 调用 convertToVO 方法，生成 VO 对象
                .collect(Collectors.toList()) // 收集 Stream 元素到新的 List 中
        );
    }

    /**
     * 获取B端登录用户信息
     * @return B端用户信息VO
     */
    @GetMapping("/login_info/get")
    public R<SysUserLoginVO> getLoginUser() {
        return R.ok(sysUserService.getLoginUser().convertToVO());
    }

}
